//网络请求函数库
//@author Leo.Liao

// 接口前缀
const API_URL = "http://localhost:8087";
// token键名
const TOKEN_KEY = "Authorization";
// 语言键名
const LANG_KEY = "Accept-Language";
// 令牌
let token = "";
let language = "";
// 请求头
let headers = {

};

/**
 * 从远程站点异步加载datagrid数据
 * @param gridId datagrid组件ID
 * @param url 数据接口地址
 * @param params 请求参数
 */
function ajaxPostLoad(gridId, url, params) {
    $('#' + gridId + '').datagrid({
        url: API_URL + url,
        queryParams: JSON.stringify(params),
        onLoadError: function (data) {
            euShow(langCommon.info, data.responseJSON.message);
            console.log(getCurrentTimePrecise() + " " + data.responseJSON.message);
        }
    });
}

/**
 * 从远程站点异步加载datagrid数据，加载完成后执行回调函数
 * @param gridId datagrid组件ID
 * @param url 数据接口地址
 * @param params 请求参数
 * @param callback 回调函数（无参）
 */ 
function ajaxPostLoadAndCallback(gridId, url, params, callback) {
    $('#' + gridId + '').datagrid({
        url: API_URL + url,
        queryParams: JSON.stringify(params),
        onLoadError: function (data) {
            euShow(langCommon.info, data.responseJSON.message);
            console.log(getCurrentTimePrecise() + " " + data.responseJSON.message);
            callback();
        },
        onLoadSuccess: function (data) {
            callback();
        }
    });
}

/**
 * 初始化Datagrid，完成之后执行回调函数
 * @param gridId datagrid组件ID
 * @param url 数据接口地址
 * @param params 查询参数
 * @param columns 数据表格列
 * @param callback 回调函数
 */
function initAndCallback(gridId, url, params, columns, callback) {
    token = getCookie(TOKEN_KEY);
    language = getCookie(LANG_KEY);
    headers[TOKEN_KEY] = token;
    headers[LANG_KEY] = language;
    $('#' + gridId + '').datagrid({
        url: API_URL + url,
        method: "get",
        queryParams: params,
        columns: columns,
        headers: headers,
        onLoadError: function (data) {
            euShow(langCommon.info, data.responseJSON.message);
            console.log(data.responseJSON.message);
            callback();
        },
        onLoadSuccess: function (data) {
            callback();
        }
    });
}

/**
 * 从远程站点异步加载数据（绑定表单查询条件，数据加载完成时（无论是否成功）执行回调函数）
 * @param formId 表单ID
 * @param gridId 数据表格ID
 * @param params 额外的请求参数
 * @param callback 回调函数名
 */
function ajaxPostLoadWithFormAndCallback(formId, gridId, url, params, callback) {
    let formData = getFormData(formId);
    token = getCookie(TOKEN_KEY);
    language = getCookie(LANG_KEY);
    headers[TOKEN_KEY] = token;
    headers[LANG_KEY] = language;
    Object.assign(params,formData);
    $('#' + gridId + '').datagrid({
        url: API_URL + url,
        method: "get",
        queryParams: params,
        headers: headers,
        onLoadError: function (data) {
            euShow(langCommon.info, data.responseJSON.message);
            console.log(getCurrentTimePrecise() + " " + data.responseJSON.message);
            callback();
        },
        onLoadSuccess: function (data) {
            callback();
        }
    });
}

/**
 * 发送异步请求并执行回调函数（不带回响应数据）（请求参数以JSON字符串格式传递）
 * @param url
 * @param params
 * @param callback
 */
function ajaxPostBodyAndCallback(url, params, callback) {
    $.ajax({
        type: "post",
        url: API_URL + url,
        headers:headers,
        contentType:"application/json;charset=UTF-8",
        crossDomain:true,
        xhrFields: {
            withCredentials: true
        },
        data: JSON.stringify(params),
        success: function (data) {
            callback();
        },
        error: function (data) {
            euShow(langCommon.info, data.responseJSON.message);
            console.log(getCurrentTimePrecise() + " " + data.responseJSON.message);
        }
    });
}

/**
 * 发送异步请求并执行回调函数（不带回响应数据）
 * @param url
 * @param params
 * @param callback
 */
function ajaxPostParamAndCallback(url, params, callback) {
    $.ajax({
        type: "post",
        url: API_URL + url,
        headers:headers,
        data: params,
        crossDomain:true,
        xhrFields: {
            withCredentials: true
        },
        success: function (data) {
            callback();
        },
        error: function (data) {
            euShow(langCommon.info, "操作失败");
            console.log(data.responseJSON);
        }
    });
}

/**
 * 发送异步请求，成功时执行回调函数获取服务器返回的数据
 * @param url
 * @param params
 */
function ajaxPostBodyAndReturn(url, params, successCallback, errorCallback) {
    $.ajax({
        type: "post",
        url: API_URL + url,
        headers:headers,
        contentType:"application/json;charset=UTF-8",
        crossDomain:true,
        xhrFields: {
            withCredentials: true
        },
        data: JSON.stringify(params),
        success: function (data) {
            successCallback(data);
        },
        error: function (data) {
            errorCallback(data.responseJSON);
        }
    });
}

/**
 * 发送异步请求并执行回调函数（带回响应数据）（请求参数以JSON字符串格式传递）
 * @param url
 * @param params
 * @param callback
 */
function ajaxPostParamAndReturn(url, params, callback) {
    $.ajax({
        type: "post",
        url: API_URL + url,
        headers:headers,
        crossDomain:true,
        xhrFields: {
            withCredentials: true
        },
        data: params,
        success: function (data) {
            callback(data);
        },
        error: function (data) {
            callback(data.responseJSON);
        }
    });
}

/**
 * 发送异步GET请求，获取服务器返回的数据
 * @param url
 * @param params
 */
function ajaxGetAndReturn(url, params, successCallback, errorCallback) {
    $.ajax({
        type: "get",
        url: API_URL + url,
        headers:headers,
        crossDomain:true,
        xhrFields: {
            withCredentials: true
        },
        data: params,
        dataType: "json",
        success: function (data) {
            successCallback(data);
        },
        error: function (data) {
            errorCallback(data.responseJSON);
        }
    });
}

/**
 * 异步提交表单（带额外参数），提交成功后执行回调函数
 *
 * @param formId
 * @param url
 * @param params
 * @param callback
 */
function ajaxSubmitAndCallback(formId, url, params, callback) {
    $("#" + formId + "").form("submit", {
        url: API_URL + url,
        queryParams: params,
        onSubmit: function () {
            return $("#" + formId + "").form("validate");
        },
        success: function (result) {
            let data = JSON.parse(result);
            if (data.code == HTTP_OK) {
                euShow(langCommon.info, langCommon.operationSuccess);
                callback();
            } else {
                euShow(langCommon.info, data.message);
                console.log(getCurrentTimePrecise() + " " + data.message);
            }
        }
    });
}

/**
 * 异步提交表单（带额外参数），提交成功后执行回调函数(带回服务器响应数据)
 * @param formId
 * @param url
 * @param params
 * @param callback
 */
function ajaxSubmitAndReturn(formId, url, params, callback) {
    $("#" + formId + "").form("submit", {
        url: API_URL + url ,
        queryParams: params,
        onSubmit: function () {
            return $("#" + formId + "").form("validate");
        },
        success: function (result) {
            let data = JSON.parse(result);
            callback(data);
        }
    });
}


/**
 * 发送同步请求，返回服务器响应数据
 * @param method
 * @param url
 * @returns {*}
 */
function syncRequest(method, url,errorCallback) {
    let xhr = new XMLHttpRequest();
    xhr.open(method, API_URL + url, false);
    xhr.send(null);
    if(xhr.responseText == null){
        xhr.responseText = "";
    }
    let responseJSON = JSON.parse(xhr.responseText);
    if (xhr.status == HTTP_OK) {
        return responseJSON;
    } else {
        console.log(getCurrentTimePrecise() + " " + xhr.responseText);
        errorCallback(responseJSON);
    }
}

/**
 * 异步加载下拉列表
 * @param id
 * @param url
 * @param valueField
 * @param textField
 * @param onSelectCallback
 */
function remoteLoadCombobox(id, url, valueField, textField,queryParams,onSelectCallback) {
    removeNullKey(queryParams);
    $("#" + id + "").combobox({
        url: API_URL + url + "?" + TOKEN_KEY + "=" + token,
        mode: 'remote',
        method: "get",
        valueField: valueField,
        textField: textField,
        queryParams: queryParams,
        onSelect: onSelectCallback
    });
}